package com.sakura.双指针;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Code15_三数之和 {

    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length;
        ArrayList<List<Integer>> ans = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            // 排序完后，如果当前元素大于0，则三数之和一定大于0，结束循环
            if (nums[i] > 0) {
                return ans;
            }
            // 去重
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            int l = i + 1, r = n - 1;
            while (l < r) {
                if (nums[i] + nums[l] + nums[r] > 0) {
                    r--;
                } else if (nums[i] + nums[l] + nums[r] < 0) {
                    l++;
                } else {
                    ans.add(List.of(nums[i], nums[l], nums[r]));
                    // b c 去重
                    while (l < r && nums[l] == nums[l + 1]) l++;
                    while (l < r && nums[r] == nums[r - 1]) r--;
                    l++;
                    r--;
                }
            }
        }
        return ans;
    }
}
